热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

楷体|方框_人工智能关于CV的这些简单操作你真的都会了吗?

篇首语:本文由编程笔记#小编为大家整理,主要介绍了人工智能-关于CV的这些简单操作你真的都会了吗?相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了人工智能-关于CV的这些简单操作你真的都会了吗?相关的知识,希望对你有一定的参考价值。




🎉作者简介:👓目前在读计算机研究生。主要研究方向是人工智能和群智能算法方向。目前熟悉python网页爬虫、机器学习、计算机视觉(OpenCV)、群智能算法。然后正在学习深度学习的相关内容。以后可能会涉及到网络安全相关领域,毕竟这是每一个学习计算机的梦想嘛!👓
📝目前更新:🎯目前已经更新了关于网络爬虫得相关系列、机器学习得相关知识、目前正在更新计算机视觉-OpenCV,后续将继续更新其他知识。🎯
📃个人主页:吃猫的鱼python个人主页
🔎支持:如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦!🎁这就是给予我最大的支持!🎁
💛本文摘要💛:


本文我们将继续讲解相关计算机视觉的相关知识。具体包括以下几个内容。
🌖1.阈值分割基础理论知识
🌖2.阈值处理代码和实现
🌖3.图像平滑-包括均值滤波、方框滤波、高斯滤波、中值滤波和卷积



文章目录


    • ⛅️前言
    • ⛅️阈值分割基础理论知识
    • ⛅️阈值处理代码及实现讲解
    • ⛅️图像平滑概念及具体知识
      • 🎍均值滤波
      • 🎍方框滤波
      • 🎍高斯滤波
      • 🎍中值滤波
      • 🎍卷积




⛅️前言


🎆OpenCV提供的视觉处理算法非常丰富,并且它部分以C语言编写,加上其开源的特性,处理得当,不需要添加新的外部支持也可以完整的编译链接生成执行程序,所以很多人用它来做算法的移植,OpenCV的代码经过适当改写可以正常的运行在DSP系统和ARM嵌入式系统中,这种移植在大学中经常作为相关专业本科生毕业设计或者研究生课题的选题。

🎆OpenCV致力于真实世界的实时应用,通过优化的C代码的编写对其执行速度带来了可观的提升,并且可以通过购买Intel的IPP高性能多媒体函数库得到更快的处理速度。

🎆可应用领域包括: 1、人机互动 2、物体识别 3、图像分割 4、人脸识别 5、动作识别 6、运动跟踪 7、机器人 8、运动分析 9、机器视觉 10、结构分析 11、汽车安全驾驶等方面


⛅️阈值分割基础理论知识

阈值分割得六种形态图:



🎉1.第一种为原始图像像素值分布图。
🎉2.二进制阈值化:假设我们设定阈值为189,如果大于189得像素值那么我们就把该像素值设置为最大值,也就是255。如果低于189得像素值,那么我们就设置该像素值为0。

🎉3.反二进制阈值化:根据意思我们就可以知道和二进制阈值化相反,那么就说明如果我们设定阈值为189,那么大于189得像素值就是0,如果低于189得像素值,那么就设定像素值为255.

🎉4.截断阈值化:假设我们设定阈值时127,那么如果像素值大于127,那么我们直接设定像素值为127,如果低于127,那么就保持像素值不变。

🎉5.反阈值化为0:假如我们设定阈值为127,那么如果像素大于127,那么我们将新的像素值设定为0,如果低于127,那么我们将保留原始得像素值。

🎉6.阈值化为0:假设我们依旧设定阈值为127,那么如果像素值高于127,那么我们保持不变,如果低于127,那么我们设定新的像素值为0.



⛅️阈值处理代码及实现讲解

阈值处理函数:
🔮函数threshold

retval, dst=cv2.threshold(src, thresh, maxval, type)

其中src表示原图像,thresh表示阈值,maxval表示最大值,type表示类型。函数对应返回两个值,分别是阈值和处理结果。

🔮二进制阈值化代码:
核心代码:cv2.THRESH_BINARY

import cv2
a=cv2.imread("image\\\\lena512.bmp",cv2.IMREAD_UNCHANGED)
r,b=cv2.threshold(a,127,255,cv2.THRESH_BINARY)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()

以lena为例子,处理结果是:

可以看出来,将原来的灰度图像处理成了只有0和最大值255的图像,可以说处理成了二值图像。
🔮反二进制阈值化代码:
核心代码:cv2.THRESH_BINARY_INV

import cv2
a=cv2.imread("image\\\\lena512.bmp",cv2.IMREAD_UNCHANGED)
r,b=cv2.threshold(a,127,255,cv2.THRESH_BINARY_INV)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()

这里只需要改动一个位置就可以,那么处理结果为:

就是和原来的二进制阈值化相反处理。
🔮截断阈值化:
核心代码:cv2.THRESH_TRUNC

import cv2
a=cv2.imread("image\\\\lena512.bmp",cv2.IMREAD_UNCHANGED)
r,b=cv2.threshold(a,127,255,cv2.THRESH_TRUNC)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()

处理结果:

也就是说将图像的明亮部分都处理在阈值以下。
🔮反阈值化为0代码:
核心代码:cv2.THRESH_TOZERO_INV

port cv2
a=cv2.imread("image\\\\lena512.bmp",cv2.IMREAD_UNCHANGED)
r,b=cv2.threshold(a,127,255,cv2.THRESH_TOZERO_INV)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()

处理结果是:

将所有亮的地方都处理为黑色。也就是说高于阈值的地方都处理呈黑色。

🔮阈值化为0代码:
核心代码:cv2.THRESH_TOZERO

import cv2
a=cv2.imread("image\\\\lena512.bmp",cv2.IMREAD_UNCHANGED)
r,b=cv2.threshold(a,127,255,cv2.THRESH_TOZERO)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()


将低于阈值部分都处理成黑色,其他不变。


⛅️图像平滑概念及具体知识


🎍均值滤波


✒️均值滤波:很明显我们通过白话来讲就是说肯定跟平均值有关,那么怎么和平均值相关的呢?

首先我们来看一下一个图像的区域像素值分布:


然后我们来看中间区域的红色部分为例子进行均值滤波处理计算:
红色点的像素新值=蓝色背景区域像素值之和除25
红色点的像素新值=
((197+25+106+156+159)+(149+40+107+5+71)+
(163+198+226+223+156)+(222+37+68+193+157)+
(42+72+250+41+75))/25

针对原始图像内的像素点,逐个采用核进行处理,得到结果图像。也就是说每一个像素点都进行这个操作。那么有什么用呢?作用就是可以把尖锐的像素点的值给模糊掉然我们来看例子
函数结果:处理结果=cv2.blur(原始图像,核大小)
核大小:以(宽度,高度)形式表示的元组

import cv2
o=cv2.imread("image\\\\lenaNoise.png")
r=cv2.blur(o,(5,5))
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()

专业一点来讲就是可以除噪:


🎍方框滤波


⚽️方框滤波:主要是看函数的最后一个属性,如果设置为-1,那么方框滤波与均值滤波一样的效果,如果设置成1,那么就表示核函数内进行相加。具体请看下面讲解。

主要函数:boxFilter。 ⚽️运行结果=cv2. boxFilter(原始图像,目标图像深度,核大小,normalize属性),⚽️其中原始图像都理解,⚽️目标图像深度通常设置成-1,表示与原始图像相同,⚽️核函数请看下方图一,如果设置呈元组(5,5)就表示为下方左边图。⚽️normalize属性表示是否对图像进行归一化处理,如果进行归一化处理就设置成ture,不设置就为false。⚽️那么如果设置归一化处理的结果就是与均值滤波完全一致,如果不设置归一化处理,那么就表示核函数之间相加。看图二


⚽️方框滤波代码部分
normalize=1就表示进行归一化处理,和不设置一样,也就是说默认就是进行归一化处理。如果设置为0,就表示不进行归一化处理。代码分别是:

import cv2
o=cv2.imread("image\\\\lenaNoise.png")
r=cv2.boxFilter(o,-1,(5,5),normalize=1)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()

import cv2
o=cv2.imread("image\\\\lenaNoise.png")
r=cv2.boxFilter(o,-1,(5,5),normalize=0)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()

对应结果分别是:


不进行归一化处理如果5×5的值相加很容易超过255,那么我们就都变成了255的像素值,也就都是白色了。
那么如果我们设置核函数为2×2呢,让核函数小一点。那么对应的结果为:

这样滤波后的结果就不都是255了,就变成了有的地方的像素值是小于255的。但是像素值都比之前要高很多。


🎍高斯滤波


🎴高斯滤波:其实高斯滤波很简单,原理就是谁离我目标点越近,我就跟谁越好,给他的东西越多,对应官方的话就是给予权重越大。让临近的像素值有更高的重要度。


🎴高斯滤波核心函数:GaussianBlur函数。

🎴dst = cv2.GaussianBlur( src , ksize , sigmaX )


其中:
🎴src为原始图像
🎴ksize核函数的大小,这里需要注意,就是设置的核函数的大小必须为奇数大小
🎴sigmaX表示高斯滤波函数X方向的方差,这里表示成水平方向的规律就好了。用来控制权重。
sigmaX=0时: sigma = 0.3((ksize-1)0.5 - 1) + 0.8


🎴高斯滤波对应代码:

import cv2
o=cv2.imread("image\\\\lenaNoise.png")
r=cv2.GaussianBlur(o,(3,3),0)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()


这里可以看出,使用高斯滤波可以完成去噪的功能,但是他是缓和的去噪,根据他的原理我们就可以知道。


🎍中值滤波


👑中值滤波:这里就很好理解了,比如我们取了核函数的大小,然后把核函数中的像素值进行排序,然后取中值替换到现在的值。


👑主要函数:medianBlur函数

👑dst = cv2.medianBlur( src , ksize )

其中src表示原始图像,ksize表示核函数的大小。同样这里的核函数的大小必须是奇数。且不是原则,直接写数字就可以,比如3就表示3*3

👑中值滤波代码部分

import cv2
o=cv2.imread("image\\\\lenaNoise.png")
r=cv2.medianBlur(o,3)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()


这里去噪最为完美因为很明显的就把很高的像素点都去掉了!!!


🎍卷积


🍼卷积:其实卷积也很简单的,之前我们介绍的均值滤波、中值滤波、方框滤波及高斯滤波都是基于图像本身做出操作,那么卷积就是我们设置了一个卷积核,用这个核去和我们图像的每一个像素值做乘法。

🍼2D卷积核心函数:
卷积核函数:kernel = np.ones((5,5),np.float32)/25
设置的是5*5的卷积核。如图:

🍼2D卷积核心函数:r=cv2.filter2D( o , -1 ,f )
-1表示图像深度和原图像一致,最后一个f表示卷积核的意思。
🍼代码部分:

import cv2
import numpy as np
o=cv2.imread("image\\lenacolor.png")
f=np.ones((5,5),np.float32)/25
r=cv2.filter2D(o,-1,f)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()

所以我们可以通过原理得到如果卷积核设置的越大,那么图像就会越模糊。

import cv2
import numpy as np
o=cv2.imread("image\\lenacolor.png")
f=np.ones((10,10),np.float32)/100
r=cv2.filter2D(o,-1,f)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()




📒文章适合于所有的相关人士进行学习📒
📒各位看官看完了之后不要立刻转身呀📒
📒期待三连关注小小博主加收藏📒
📒小小博主回关快 会给你意想不到的惊喜呀📒
各位老板动动小手给小弟点赞收藏一下,多多支持是我更新得动力!!!



推荐阅读
  • HBase Java API 进阶:过滤器详解与应用实例
    本文详细探讨了HBase 1.2.6版本中Java API的高级应用,重点介绍了过滤器的使用方法和实际案例。首先,文章对几种常见的HBase过滤器进行了概述,包括列前缀过滤器(ColumnPrefixFilter)和时间戳过滤器(TimestampsFilter)。此外,还详细讲解了分页过滤器(PageFilter)的实现原理及其在大数据查询中的应用场景。通过具体的代码示例,读者可以更好地理解和掌握这些过滤器的使用技巧,从而提高数据处理的效率和灵活性。 ... [详细]
  • 深入解析 OpenSSL 生成 SM2 证书:非对称加密技术与数字证书、数字签名的关联分析
    本文深入探讨了 OpenSSL 在生成 SM2 证书过程中的技术细节,重点分析了非对称加密技术在数字证书和数字签名中的应用。非对称加密通过使用公钥和私钥对数据进行加解密,确保了信息传输的安全性。公钥可以公开分发,用于加密数据或验证签名,而私钥则需严格保密,用于解密数据或生成签名。文章详细介绍了 OpenSSL 如何利用这些原理生成 SM2 证书,并讨论了其在实际应用中的安全性和有效性。 ... [详细]
  • 本文深入解析了Python在处理HTML过滤时的实现方法及其应用场景。通过具体实例,详细介绍了如何利用Python代码去除HTML字符串中的标签和其他无关信息,确保内容的纯净与安全。此外,文章还探讨了该技术在网页抓取、数据清洗等领域的实际应用,为开发者提供了宝贵的参考。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • Swoole加密机制的安全性分析与破解可能性探讨
    本文深入分析了Swoole框架的加密机制,探讨了其在实际应用中的安全性,并评估了潜在的破解可能性。研究结果表明,尽管Swoole的加密算法在大多数情况下能够提供有效的安全保护,但在特定场景下仍存在被攻击的风险。文章还提出了一些改进措施,以增强系统的整体安全性。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 深入解析:React与Webpack配置进阶指南(第二部分)
    在本篇进阶指南的第二部分中,我们将继续探讨 React 与 Webpack 的高级配置技巧。通过实际案例,我们将展示如何使用 React 和 Webpack 构建一个简单的 Todo 应用程序,具体包括 `TodoApp.js` 文件中的代码实现,如导入 React 和自定义组件 `TodoList`。此外,我们还将深入讲解 Webpack 配置文件的优化方法,以提升开发效率和应用性能。 ... [详细]
  • 在《Python编程基础》课程中,我们将深入探讨Python中的循环结构。通过详细解析for循环和while循环的语法与应用场景,帮助初学者掌握循环控制语句的核心概念和实际应用技巧。此外,还将介绍如何利用循环结构解决复杂问题,提高编程效率和代码可读性。 ... [详细]
  • 深入探索 JavaScript 中 Array 数组对象的基本操作与应用
    深入探索 JavaScript 中 Array 数组对象的基本操作与应用 ... [详细]
  • 基于OpenCV的图像拼接技术实践与示例代码解析
    图像拼接技术在全景摄影中具有广泛应用,如手机全景拍摄功能,通过将多张照片根据其关联信息合成为一张完整图像。本文详细探讨了使用Python和OpenCV库实现图像拼接的具体方法,并提供了示例代码解析,帮助读者深入理解该技术的实现过程。 ... [详细]
  • 本文汇集了我在网络上搜集以及在实际面试中遇到的前端开发面试题目,并附有详细解答。无论是初学者还是有一定经验的开发者,都应深入理解这些问题背后的原理,通过系统学习和透彻研究,逐步形成自己的知识体系和技术框架。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 在 CentOS 7 系统中安装 Scrapy 时遇到了一些挑战。尽管 Scrapy 在 Ubuntu 上安装简便,但在 CentOS 7 上需要额外的配置和步骤。本文总结了常见问题及其解决方案,帮助用户顺利安装并使用 Scrapy 进行网络爬虫开发。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 【图像分类实战】利用DenseNet在PyTorch中实现秃头识别
    本文详细介绍了如何使用DenseNet模型在PyTorch框架下实现秃头识别。首先,文章概述了项目所需的库和全局参数设置。接着,对图像进行预处理并读取数据集。随后,构建并配置DenseNet模型,设置训练和验证流程。最后,通过测试阶段验证模型性能,并提供了完整的代码实现。本文不仅涵盖了技术细节,还提供了实用的操作指南,适合初学者和有经验的研究人员参考。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有